package fag.core.collision;

import java.util.List;

import fag.core.geometry.Vector2D;

/**
 * Classe représentant une éventuelle collision entre deux boîtes de collision.
 * @author lumz
 */
public class Collision {
	
	boolean mayCollide = true;
	
	private Hitbox a = null;
	private Hitbox b = null;
	
	private Gjk.Result gjkResult = null;
	private Epa.Result epaResult = null;
	
	/**
	 * Constructeur par défaut.
	 * @param a La première boîte de collision.
	 * @param b La seconde boîte de collision.
	 */
	public Collision(Hitbox a, Hitbox b) {
		this.a = a.clone();
		this.b = b.clone();
	}
	
	/**
	 * Accesseur du patch de contact.
	 * @return Le patch de contact de la collision.
	 */
	public List<Vector2D> getContactManifold() {
		return Clipping.getResult(a, b, getNormal());
	}

	/**
	 * Accesseur de la normale de collision.
	 * @return En cas de collision, le vecteur normal de collision, sinon un vecteur de norme nulle.
	 */
	public Vector2D getNormal() {
		
		if(gjkResult == null)
			gjkResult = Gjk.getResult(a, b);
		
		if(isColliding() == false)
			return new Vector2D();
		
		if(epaResult == null)
			epaResult = Epa.getResult(a, b, gjkResult.getSimplex());
		
		return epaResult.getNormal();
	}
	
	/**
	 * Accesseur de la penetration de collision.
	 * @return 0 si aucune collision.
	 */
	public double getPenetration() {
		
		if(gjkResult == null)
			gjkResult = Gjk.getResult(a, b);
		
		if(isColliding() == false)
			return 0;
		
		if(epaResult == null)
			epaResult = Epa.getResult(a, b, gjkResult.getSimplex());
		
		return epaResult.getPenetration();
	}
	
	/**
	 * Accesseur de la valeur de vérité de la collision.
	 * @return La valeur de vérité de la collision.
	 */
	public boolean isColliding() {
		
		if(mayCollide) {
			
			if(gjkResult == null)
				gjkResult = Gjk.getResult(a, b);
			
			return gjkResult.isColliding();
		}
		
		return false;
	}
}
